package clases;

import java.util.*;

//seccion se encargara de generar los ordenamientos
class ComparadorCI implements Comparator<Estudiante>
{
	public int compare(Estudiante est1, Estudiante est2)
	{
		return est1.getCedula().compareTo(est2.getCedula());
	}

}
class ComparadorNF implements Comparator<Estudiante>
{
	public int compare(Estudiante est1, Estudiante est2)
	{
		if(est1.getNotaf() < est2.getNotaf())
			return 0;
		else if (est1.getNotaf() > est2.getNotaf())
			return 1;
		else
			return 2;
	}

}

public class Seccion {
	
	protected String numero_sec;
	protected Estudiante EstudiantesInscritos;
	protected Profesor ProfesorAsignado;
	private boolean pre_exa= false;
	LinkedList<Estudiante> lisEstudiante,lisAux;
	LinkedList<Profesor> lisProfesor;

        public LinkedList<Estudiante> ordenarCedula(){
                Collections.sort(lisEstudiante, new ComparadorCI());
                return lisEstudiante;
        }

        public LinkedList<Estudiante> ordenarNota(){
                Collections.sort(lisEstudiante, new ComparadorNF());
                return lisEstudiante;
        }
	
	
//	Constructor con parametros
	

	// Contrusctor de la superclase o contstructor por defecto
	public Seccion() {
		super();
		// TODO Auto-generated constructor stub
		lisEstudiante = new LinkedList<Estudiante>();
		lisProfesor = new LinkedList<Profesor>();
                ProfesorAsignado = null;
                numero_sec="";
	}

	public Seccion(String numero_sec, Estudiante estudiantesInscritos,
			Profesor profesorAsignado) {
		super();
		this.numero_sec = numero_sec;
		EstudiantesInscritos = estudiantesInscritos;
		ProfesorAsignado = profesorAsignado;
		lisEstudiante = new LinkedList<Estudiante>();
		lisProfesor = new LinkedList<Profesor>();
	}


	//Getters y setters
	
	public int Tamaño()
	{
		return lisProfesor.size();
	}

	public LinkedList<Estudiante> getLisEstudiante() {
		return lisEstudiante;
	}


	public String getNumero_sec() {
		return numero_sec;
	}

	public LinkedList<Profesor> getLisProfesor() {
		return lisProfesor;
	}

    public void setNumero_sec(String numero_sec) {
        this.numero_sec = numero_sec;
    }

        
	

	public Estudiante getEstudiantesInscritos() {
		return EstudiantesInscritos;
	}

	public void setEstudiantesInscritos(Estudiante estudiantesInscritos) {
		EstudiantesInscritos = estudiantesInscritos;
	}

	public Profesor getProfesorAsignado() {
		return ProfesorAsignado;
	}

	public void setProfesorAsignado(Profesor profesorAsignado) {
		ProfesorAsignado = profesorAsignado;
	}

	// Metodo Asignar Profesor
	public void AsignarProfesor(Profesor profe)
	{
		lisProfesor.add(profe);
		setProfesorAsignado(profe);
		
	}
	public void Eli_Prof(String ci){
		ListIterator<Profesor> it = lisProfesor.listIterator();
		while (it.hasNext()){
			Profesor profe= it.next();
			if (profe.getCedula().equals(ci)){
				it.remove();
				break;
			}
				
			
		}
			
		
	}
	
	
	//MEtodo Inscribir Estudiante
	public void InscribirEstudiante(Estudiante estud)
   { 
				lisEstudiante.add(estud);
   }
	
	//MEtodo Retirar Estudiante
	public boolean RetirarEstudiante(String ci) {
		ListIterator<Estudiante> it = lisEstudiante.listIterator();
		while (it.hasNext()) {
			Estudiante estud = it.next();
			if (estud.getCedula().equals(ci))
			{
				it.remove();
				return true;
			}
		}
                return false;
	}
	
	//Metodo Buscar Estudiante
   public Estudiante BuscarEstudiante(String ci)
   {
	   ListIterator<Estudiante> it = lisEstudiante.listIterator();
	   while (it.hasNext()) 
	   {
			Estudiante estud = it.next();
			if (estud.getCedula().equals(ci))
			{
				return estud;
			}
	   }
	   return null;
   }
   
   //Metodo Aplicar Evaluacion
   public void AplicarEvaluacion()
   {
	   LinkedList<Estudiante> lista = getLisEstudiante();
	   ListIterator<Estudiante> it = lista.listIterator();
	   while (it.hasNext()) 
	   {
		   Estudiante estud = it.next();
		   estud.PresentarEva();
		   System.out.println("cedula:"+ estud.getCedula());
		   System.out.println("nombre:"+ estud.getNombre());
		   System.out.println("apellido:"+ estud.getApellido());
		   System.out.println("nota1:"+ estud.getNota1());
		   System.out.println("nota2:"+ estud.getNota2());
		   System.out.println("nota3:"+ estud.getNota3());
		   System.out.println("nota final:"+ProfesorAsignado.EvaluarEst(estud));
		   System.out.println("estado:"+ ProfesorAsignado.estado(estud));
	   }
   }
   
   
   
   public boolean pre_exa() {
	   return pre_exa;
   }

   public void setpre_exa(boolean pre_exa) {
	   this.pre_exa = pre_exa;
   }

   

//Metodo Buscar Profesor
   public Profesor BuscarProfesor(String ci)
   {
	   ListIterator<Profesor> it = lisProfesor.listIterator();
	   while (it.hasNext()) 
	   {
			Profesor profe = it.next();
			if (profe.getCedula().equals(ci))
			{
				return profe;
			}
	   }
	   return null;
   }
   
  
   public void imprimir_est(Profesor profe){
	   LinkedList<Estudiante> lista = getLisEstudiante();
	   ListIterator<Estudiante> it= lista.listIterator();
	   while (it.hasNext()){
		   if ((lista!=null)){
		   Estudiante estud= it.next();
		   System.out.println(estud.getCedula());
		   System.out.println(estud.getNombre());
		   System.out.println(estud.getApellido());
		   System.out.println(estud.NotaF());
		   System.out.println(profe.estado(estud));
		   }
	   else{
		   System.out.println("la seccion no contiene estudiantes inscritos");
	   }
   }
	  }
   
	   
	   

public void imprimir_prof(){
	   LinkedList<Profesor> lista = getLisProfesor();
	   ListIterator<Profesor> it= lista.listIterator();
	   while (it.hasNext()){
		   Profesor profe= it.next();
		   System.out.println(profe.getCedula());
		   System.out.println(profe.getNombre());
		   System.out.println(profe.getApellido());
		   }
	   }
public void imprimir_aux(Profesor profe)
{	
	   ListIterator<Estudiante> it= lisAux.listIterator();
	   while (it.hasNext()){
		   Estudiante estud= it.next();
		   System.out.println(estud.getCedula());
		   System.out.println(estud.getNombre());
		   System.out.println(estud.getApellido());
		   System.out.println(estud.NotaF());
		   System.out.println(profe.estado(estud));
		   }
	   }
public void listaAprobados(){
	lisAux= new LinkedList<Estudiante>();
	ListIterator<Estudiante> it= lisEstudiante.listIterator();
	while(it.hasNext()){
		Estudiante estud= it.next();
		if(ProfesorAsignado.EvaluarEst(estud)>=10){
			lisAux.add(estud);
          

		}
			}
	
	imprimir_aux(ProfesorAsignado);
	
}
public void listaAplazados(){
	lisAux= new LinkedList<Estudiante>();
	ListIterator<Estudiante> it= lisEstudiante.listIterator();
	while(it.hasNext()){
		Estudiante estud= it.next();
		if(ProfesorAsignado.EvaluarEst(estud)<10){
			lisAux.add(estud);
		}
	
	}
	imprimir_aux(ProfesorAsignado);
	
}

    public LinkedList<Estudiante> getLisAux() {
        return lisAux;
    }




public float PromedioNotas(){
	LinkedList<Estudiante> lista = getLisEstudiante();
	ListIterator<Estudiante> it= lista.listIterator();
	float acum_nf=0;
	int cont = 0;
	
	while(it.hasNext())
	{
		Estudiante estud = it.next();
		acum_nf= acum_nf + ProfesorAsignado.EvaluarEst(estud);
		cont++;
}
return acum_nf/cont;
}

public void NotaSustitutiva(Estudiante estud,Profesor profe)
{
	float notamenor=estud.getNota1();
	lisAux= new LinkedList<Estudiante>();
	ListIterator<Estudiante> it= lisEstudiante.listIterator();
	while(it.hasNext()){
		estud= it.next();
		if(profe.EvaluarEst(estud)<10){
			lisAux.add(estud);
		}
	
	}
		
	if (notamenor>estud.getNota2()){
		notamenor=estud.getNota2();
		estud.setNota2((float)(Math.random()*20));
	}
	else if(notamenor>estud.getNota3()){
		notamenor=estud.getNota3();
		estud.setNota3((float)(Math.random()*20));
		
	}
		
	estud.setNota1((float)(Math.random()*20));
		
	imprimir_aux(profe);
}





}//fin de la clase


